import observe from "./observe";
import Dep from './Dep'

// TODO：将数据转换成响应式的
export default function defineReactive (obj, key, val) {
    const dep = new Dep()
    // 1 无val值
    if (!val) {
        val = obj[key]
    }
    // 2 调用处理函数，由于内部做了判断，非对象会直接出去，所以非常安全
    let childOb = observe(val)
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get () {
            console.log('访问了' + key + '属性');
            // 如果现在处于依赖收集阶段
            if (Dep.target) {
                dep.addDepend()
                if (childOb) {
                    // 对象嵌套也需要添加依赖
                    // childOb.dep.addDepend()
                }
            }
            return val
        },
        set (newV) {
            console.log('设置了' + key + '属性');
            if (val === newV) {
                return
            }
            val = newV
            // 以防新值为一个 对象，索引需要在处理一次
            childOb = observe(newV)
            // 发布订阅模式
            dep.notify()
        }
    })
}